package com.android.support.lib.universal.util;

import java.io.File;

import android.content.Context;
import android.widget.ImageView;

import com.android.support.lib.universal.R;
import com.android.support.lib.universal.base.BaseApplication;
import com.android.support.lib.universal.general.GeneralCache;
import com.nostra13.universalimageloader.cache.disc.impl.UnlimitedDiskCache;
import com.nostra13.universalimageloader.cache.disc.naming.Md5FileNameGenerator;
import com.nostra13.universalimageloader.cache.memory.impl.UsingFreqLimitedMemoryCache;
import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.ImageLoaderConfiguration;
import com.nostra13.universalimageloader.core.assist.ImageScaleType;
import com.nostra13.universalimageloader.core.assist.QueueProcessingType;
import com.nostra13.universalimageloader.core.display.FadeInBitmapDisplayer;
import com.nostra13.universalimageloader.core.display.RoundedBitmapDisplayer;
import com.nostra13.universalimageloader.core.download.BaseImageDownloader;
import com.nostra13.universalimageloader.core.listener.ImageLoadingListener;

/**
 * 网络图片加载，默认的缓存图片不能太大哦，一般不超过2KB,并且宽和高都不超过400像素，否则手机都可能报错
 * 需要在AndroidManifest.xml中指明BaseApplication类或其子类。
 * 如：android:name="com.android.support.lib.universal.base.BaseApplication" 使用：
 * UtilUniversal.getInstance().setRoundImage(url, iv);// 获取网络图片(圆角)
 * UtilUniversal.getInstance().setImage(url, iv);// 获取网络图片(普通图片，不带圆角)
 * 
 * @author 彭治铭
 *
 */
public class UtilUniversal {
	private static Context context = BaseApplication.getInstance();
	private static UtilUniversal universalUtil;
	private ImageLoader imageLoader;
	private DisplayImageOptions options, optionses;

	public static UtilUniversal getInstance() {
		if (universalUtil == null) {
			universalUtil = new UtilUniversal();
		}
		return universalUtil;
	}

	public UtilUniversal() {
		super();
		// 这个是你希望的缓存文件的目录：imageloader/Cache
		File cacheDir = GeneralCache.getCacleImg();
		ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(
				context)
				// 保存的每个缓存文件的最大长宽
				.memoryCacheExtraOptions(480, 800)
				// 线程池内加载的数量
				.threadPoolSize(3)
				.threadPriority(Thread.NORM_PRIORITY - 2)
				.denyCacheImageMultipleSizesInMemory()
				// 你可以通过自己的内存缓存实现
				.memoryCache(new UsingFreqLimitedMemoryCache(2 * 1024 * 1024))
				.memoryCacheSize(2 * 1024 * 1024)
				.discCacheSize(50 * 1024 * 1024)
				// 将保存的时候的URI名称用MD5 加密
				.discCacheFileNameGenerator(new Md5FileNameGenerator())
				.tasksProcessingOrder(QueueProcessingType.LIFO)
				// 缓存的文件数量
				.discCacheFileCount(100)
				// 自定义缓存路径
				.discCache(new UnlimitedDiskCache(cacheDir))
				.defaultDisplayImageOptions(DisplayImageOptions.createSimple())
				.imageDownloader(
						new BaseImageDownloader(context, 5 * 1000, 30 * 1000)) // 超时时间
				.writeDebugLogs().build();// 开始构建
		ImageLoader.getInstance().init(config);// 全局初始化此配置
		imageLoader = ImageLoader.getInstance();
		options = new DisplayImageOptions.Builder()
				.showImageOnLoading(R.drawable.lib_damaged) // 设置图片在下载期间显示的图片
				.showImageForEmptyUri(R.drawable.lib_damaged)// 设置图片Uri为空或是错误的时候显示的图片
				.showImageOnFail(R.drawable.lib_damaged) // 设置图片加载/解码过程中错误时候显示的图片
				.cacheInMemory(true)// 设置下载的图片是否缓存在内存中
				.cacheOnDisc(true)// 设置下载的图片是否缓存在SD卡中
				.considerExifParams(true) // 是否考虑JPEG图像EXIF参数（旋转，翻转）
				.imageScaleType(ImageScaleType.EXACTLY_STRETCHED)// 设置图片以如何的编码方式显示
				.resetViewBeforeLoading(true)// 设置图片在下载前是否重置，复位
				.displayer(new FadeInBitmapDisplayer(300))// 是否图片加载好后渐入的动画时间
				.displayer(new RoundedBitmapDisplayer(20))// 是否设置为圆角，弧度为多少，必须在最后设置才有效。即最后设置该属性，然后.build()
				.build();// 构建完成
		optionses = new DisplayImageOptions.Builder()
				.showImageOnLoading(R.drawable.lib_damaged) // 设置图片在下载期间显示的图片
				.showImageForEmptyUri(R.drawable.lib_damaged)// 设置图片Uri为空或是错误的时候显示的图片
				.showImageOnFail(R.drawable.lib_damaged) // 设置图片加载/解码过程中错误时候显示的图片
				.cacheInMemory(true)// 设置下载的图片是否缓存在内存中
				.cacheOnDisc(true)// 设置下载的图片是否缓存在SD卡中
				.considerExifParams(true) // 是否考虑JPEG图像EXIF参数（旋转，翻转）
				.imageScaleType(ImageScaleType.EXACTLY_STRETCHED)// 设置图片以如何的编码方式显示
				.resetViewBeforeLoading(true)// 设置图片在下载前是否重置，复位
				.displayer(new FadeInBitmapDisplayer(300))// 是否图片加载好后渐入的动画时间
				.build();// 构建完成

	}

	/**
	 * 图片带有圆角，不适用于自定义圆形控件
	 * 
	 * @param uri
	 *            网络图片地址
	 * @param imageView
	 *            控件
	 */
	public void setRoundImage(String uri, ImageView imageView) {
		imageLoader.displayImage(uri, imageView, options);
	}

	/**
	 * 图片不带有圆角，适用于普通控件，也适用于自定义圆形图片控件（不带圆角就是为了防止和圆形控件冲突）
	 * 
	 * @param uri
	 *            网络图片地址
	 * @param imageView
	 *            控件,适用于圆形图片控件
	 */
	public void setImage(String uri, ImageView imageView) {
		imageLoader.displayImage(uri, imageView, optionses);
	}

	/**
	 * 
	 * @param uri
	 *            网络图片uri
	 * @param imageView
	 *            控件
	 * @param listener
	 *            图片加载监听
	 * 
	 *            new ImageLoadingListener() {
	 * @Override public void onLoadingCancelled(String arg0, View arg1) { //
	 *           加载取消的时候执行 }
	 * @Override public void onLoadingComplete(String arg0, View arg1, Bitmap
	 *           arg2) { // 加载完成 }
	 * @Override public void onLoadingFailed(String arg0, View arg1, FailReason
	 *           arg2) { // 加载失败的时候执行 }
	 * @Override public void onLoadingStarted(String arg0, View arg1) { //
	 *           开始加载的时候执行 }
	 */
	public void setImage(String uri, ImageView imageView,
			ImageLoadingListener listener) {
		imageLoader.displayImage(uri, imageView, options, listener);
	}

	/**
	 * 清除缓存
	 */
	public void clear() {
		imageLoader.clearDiskCache();
	}
}
